查看原文
其他

追求极限性能的芯片设计方法(二)

2017-06-07 吴臻志 StarryHeavensAbove

前情提示

系列文章的第一部分“追求极限性能的芯片设计方法(一)”介绍了有关芯片指标关系和权衡方法的概述,可给予读者有关芯片的初期设计,评测,芯片选型,芯片优化提供一定程度的参考。文中末尾部分阐述了效率优化是提升系统能效的关键,但并未作具体阐述。因而本文就从效率在时空资源中的定义出发,介绍在实际设计中追求极限效率的方法。


这一部分将介绍:极限量化方法


为什么采用极限量化方法

首先,我们真的能达到极限吗?一般不能。比如一个单核单发射RISC处理器的极限处理效率是1 IPC(Instruction per clock),因为Program Memory每个时钟顶多给出一条指令。而一个优秀的单发射处理器的IPC只能做到0.8-0.9,而不是1。但是我们定义并逼近极限是有意义的。我们不能直接设计一个想当然的结构,那样的话可能效率会更低。因此,我们先要定义这个系统可实现的极限效率(这个极限是逻辑的而非物理的,因此与工艺制程无关),并让其所有的器件以这个效率为基础进行优化,最后找出无法达到满效率的损失来源,并努力损失最小化,从而设计出高效的系统。另一方面,这样做也是为了告诉设计者,不可能设计出更高效的系统了,因为你已经达到或接近了极限。

这个思维在工程方法中经常被应用,例如通信中的信道容量(香农限),一直以来都认为是可望而不可及的理论限,直到Turbo和LDPC的产生,使得与极限的差距变得微乎其微。近些年,一些先进的译码算法如极化码等也表明了可以无限接近此极限,因而被认可为具有极限优良性能的译码结构。又例如信号检测与估计中的Cramér–Rao lower bounds为任何无偏估计量的方差确定了一个下限,我们设计的任何无偏估计器都只能渐进达到而不会超越这个限,因此也作为诸多算法是否足够优秀的评测准则。下面我们就阐述如何定义数字逻辑电路极限。


引入操作(Operation)的概念

首先,我们定义极限,就要有一个可以衡量的任务单元,在数字系统(处理器或者加速器),最主流的任务单元是操作。根据它再换算出任务(图像,比特等)。研究各种应用,基本都可以从研究它们的操作的个数开始。我们将操作作为空间维度上的最小度量单元

操作(OP)依照器件的种类不同也可以进一步定义。例如对于DSP处理器,由于其做的更多的是乘加运算,因此通常标定为GMACS或TMACS,对于GPGPU,由于其做的更多的是浮点运算,因此通常标定为GFLOPS。对于一些通用处理器,由于其做的是指令运算(Instruction),一般采用MIPS来表示。对于一些加速器或专用处理器,由于混合了各类操作(Operations),因此一般采用TOPS或GOPS来表示。

目前比较有争议的是内存和控制逻辑上的操作,例如硬件Loop,是否应该算作Operations,对于加速器和专用处理器而言,很多情况下由于硬件对其进行了优化加速,因此确实有抵消掉相应指令(Instruction)的作用,因此本文默认Operation包括RISC处理其汇编级别等效的Operation。

例:一个同构多核系统的峰值计算能力

图1. 一个简单的同构多核系统结构的MAC和OPS计算

思考:如果一个同构多核系统包括三个处理器(Proc.),每个处理器包括一个乘加器,一个通用运算逻辑单元和一个存取单元,其中乘加器只能进行乘累加操作,通用运算单元包括加、减、乘、移位等操作(AL),存取单元只包括寄存器读写和内存与寄存器的load/store(LS)操作。那么此系统在1GHz时钟下的峰值计算能力是多少?

回答3 Proc x (1 MAC + 1 AL + 1 LS) x 1 GHz = 12 GOPS。在这里1MAC = 2 OP。值得注意的是,在一些CISC计算机(x86)中LS可不计为操作,此时有3 Proc x (1 MAC + 1 AL) x 1 GHz = 9 GOPS。


将时钟作为尺度

在硬件设计中,我们无法在早期获得太多的物理参数,因此我们的极限定义最好是逻辑上的。由于当前的数字逻辑运行是基于时钟的,可以认为最小的计算节拍是一个时钟,因此我们将时钟作为时间维度的最小度量单元


定义时空二维计算资源

我们定义在一个时钟内,一个运算单元至多进行一个运算,即时空单元(P)。系统可以具有多个运算单元,具有多个处理时钟,因此就具有了一个二维的运算资源。如果系统的某个组件具有L个并行运算单元,计算了N个时钟,那么总时空单元数应为L*N。


效率e在二维计算资源中的等效定义

执行效率定义为在时空二维计算资源网格上,有效计算的时空单元数量Pused与总时空单元数量Ppeak的比值,即

e = Pused/Ppeak

从而有效时空单元数定义为L*N*e,e越大,则硬件执行效率越高。如图2所示。

图2. 采用二维计算资源格定义的效率 其中灰色为有效时空单元,e = 10/20 = 0.5

我们回想一下“追求极限性能的芯片设计方法(一)”曾经提到的那个核心的制衡关系:

时钟主频(clks/s) * 并行度(Ops/clk)* 效率 = 有效计算能力(Ops/s)  (1)

我们用时钟个数代替时钟主频(即不对时间做归一化),有:

时钟个数(clks) * 并行度(Ops/clk)* 效率 = 有效时空单元数(Ops)   (2)

可知系列文章(一)中定义的效率与本处二维资源格效率的定义实际上是一样的。

 

例:一个可以达到满效率的流水卷积电路(FIR滤波器电路)

流水卷积电路就是一个达到了二维资源格满效率的运算逻辑,如图3所示。输入信号一个D触发器构成的延迟逻辑,与权重相乘,之后进行加和得到输出。输入与D触发器每时钟更新一次,因此每时钟得到一个输出。此电路中,每个时钟下每个乘运算单元和加运算单元都进行了运算,e=1。

图3. FIR滤波器电路

效率e对电路性能指标关系的简单理解

对于一个给定运算量的系统(比如一个算法或信号处理程序),当需要映射的运算总量是固定的,e越大,映射的越密集,所需要的硬件并行度和执行时钟数就越少。并行度越小,芯片的面积开销越小;另外,在一定时间内,更少的时钟数相当于更低的时钟主频。因此e越大则芯片的面积开销和动态功耗开销越低。对于芯片的静态功耗,可认为更大的e代表功耗中的静态功耗的比重更低,通过降频,可以实现降压,从而降低静态功耗。e最大为1,一般而言无法达到满效率。设计低功耗系统,在前端结构设计上,就等价于设计高e值结构。设计高吞吐系统,也相当于设计高e值结构。其它情形将在本文逐一讨论。


定义流水结构下的效率

流水线是最典型的时序驱动数字电路工作模式,因此流水线的效率是数字电路效率的主要衡量。上文阐述的是并行工作单元的效率,这个定义是完备的。然而,这些并行单元可以分布在一个流水级里边,也可以分布在很多流水级。当这些并行单元处于各个流水级时,流水线约束了这些单元的数据依赖关系,或者说是输入输出关系。因此流水线是对并行逻辑的一种约束,造成了二维资源格的效率的下降。

例如,流水线下效率损失的主要因素之一是流水的头和尾的问题。Prologue(流水头)指的是在流水线刚刚开始运行时,数据冲入流水线的时间,Epilogue(流水尾)指的是流水线结束运行前,让所有流水中的数据通过所需的额外的时间。对于多级流水而言,即使流水线处于等价时钟的满效率,由于Prologue和Epilogue的存在,仍然会造成效率丢失。因此连续工作比突发工作更高效,我们尽量让流水线工作在连续的状态下,增大Body/( Prologue+ Body+Epilogue)的比例,可以减少头尾开销,提高效率。另外,减小流水线级数可以降低这些开销。

图4. 流水结构下的效率

而这种约束又是必须的,一方面,它可以实现算法中的顺序执行流;另一方面,它可以让电路具有统一的时钟节拍。

 

流水结构下的极限效率优化方法-时序图法

流水结构下的极限效率优化实际上是时钟级的运算过程编排。本文介绍一种基于时序图的编排方法。

时序图与图3b类似,我们需要做的就是将所需运算映射到数据通路的“器件-时间”二维平面里,填得越满效率越高。具体而言就是在满足变量的依赖关系下,并行通路个数一定时,尽量缩短横轴时钟个数。

我们做时序图编排时,可先只考虑数据通路和内存接口。之后再考虑控制逻辑、地址编排、转置逻辑和输入输出等。

这个过程可以在Excel表格完成,也可以将其打印出来,用铅笔完成。本人更喜欢后者。


时序图法完成后的早期量化评估

早期量化是构建一个好的设计的核心。即使只有数据通路的结论,我们仍然可以得到或评估出系统的关键量化信息。一般的,在合理的需求下,可以估计出的指标包括:

  1. 效率e;

  2. 电路的并行度、吞吐量、峰值计算能力、有效计算能力等;

  3. 对时钟和并行度归一化的吞吐率性能,对吞吐率归一化的面积开销性能;在e确定的情况下,吞吐量、面积开销和时钟主频这三个变量具有制约关系,因此只能最多要求两个,另一个可以估计出来。

这里的面积开销指的是数据通路(运算单元)的面积开销。对于其它面积开销,没有办法在此处给出。一般而言,内存的面积开销可以通过内存编译器给出。控制逻辑部分一般而言不会占用很大比例,且可以预先估计一个保守值。另外,内存数据转置网络或者路由系统的面积需要更多评估。

做出芯片之前,功耗估计都不会太准确,或者说需要构建一个模型,峰值功耗才准确。而实际运行时,不可能所有元器件的活动因子为1(即所有晶体管全翻转),因此根据应用不同,功耗也不一样。但是降低功耗的方法可以使用。因此本处也无法对功耗进行评估。

这些信息基本上已经是前端设计能够获知的关于运算能力方面的绝大多数信息了。如果这个部分没有想好,请先慎重考虑,之后再进行其它的部分的设计。

补充一点的是,在本文中,主要阐述的是对于若干强支持算法的高度优化,因此早期量化结果是手工计算的。对于很多弱支持的算法,或者复杂代码,可以采用profiling等自动化分析评估工具,今后会讨论这个问题。但总之,没有量化分析,我们就相当于凭着感觉走,也许能做出好设计,但这并不是能说服他人的方法。

 

系统的效率

以上可以认为是单个器件的高效率设计方法,而我们关注的并不是单个器件的效率,是整个系统的效率。因此下文从系统的角度阐述效率。

 一个数字电路系统可能由多个模块构成,如果这些模块配合不当,或者运算能力配比不当,都会影响系统的效率。配合不当一般是电路级问题,例如内存子系统需要和数据通路按时钟匹配,在进行详细设计的时候会解决。而配比不当是系统级问题,需要在体系结构设计时就考虑。在此我们给出资源配平方法。


资源配平方法

首先我们回忆一下木桶效应,即如果一个系统具有N个前后依赖的模块,吞吐量分别为On(n<=N),则系统的吞吐量小于等于min(On)。可见,系统的短板会严重影响整个系统的能力。我们需要抓住主要矛盾,优化短板。如果处于前后依赖的所有子系统的吞吐量基本相当,那么这个系统的整体吞吐量应该是一个较优值。也就是说,我们需要对资源进行配平。

这个配平可以是横向的也可以是纵向的,如图5a所示,PE1和PE2向PE3提供数据,PE3向PE4提供数据。首先进行分模块的配平(横向配平),再进行分项目配平(纵向配平)。横向配平中,首先确定链条中各个单元的依赖关系,例如PE3需要接收两个PE1的数据和一个PE2的数据,计算的一个结果引起PE4的一个计算。那么各个PE的运算资源、路由资源的配平关系就可以确定出来,如图5b。之后确定存储资源(本地存储资源和全局存储资源)。

图5. 资源配平示意图

有效的纵向配平包括存储带宽与数据通路的输入输出数据量之间的配平,路由传输能力与模块计算能力的配平,如图4c,它反映了系统总体对各类资源的配置情况,往往可以通过对原始算法的profiling进行分析就可以大致确定,例如总运算量、总存储量、总通信量等。


基于主导因素的设计方法

以上讨论的部分都是基于资源充分利用的设计方法,下面需要讨论的是另一个角度,就是基于主导因素的设计方法。

(1) 计算能力主导的设计

如果这个系统是运算能力主导的系统(即运算能力有瓶颈,需要尽可能提升运算能力),那么我们应该让系统尽量达到这个有效运算能力。方法主要是提升并行度、提升主频和提升效率。系列文章(一)已经讲过调并行和调主频,即并行吞吐原理和主频调节原理,上文也阐述过了极限效率优化的时序图编排方法。这三个方法综合考量,就可以设计出计算能力主导的设计了。

(2) 输入输出节点(路由效率)主导的设计方法

对于很多系统,由于输入输出带宽的限制,即使本地节点吞吐率增高,也无法达到全局的效率优势。此时整个系统受限于关键接口或关键路由节点的带宽。如果这个限制是由于数据速率不均匀(突发)造成的,可以通过加大输入/输出缓冲区缓解,或者调整数据的发送顺序。

另一种情况是由于某个数据源的获取速率过低或延迟过大,拖累了整个系统。这种情况下如果能够打破对其的依赖,才能进一步提升速率。因此这样的系统的吞吐量由输入输出带宽决定,系统内部处理能力做到达到或略超过输入输出吞吐能力即可。

(3) 内存带宽主导的设计方法

如果这个系统是内存带宽主导的系统(即内存带宽导致效率瓶颈的系统),那么我们应该让系统尽量达到这样的极限存储带宽。在此基础上,配备尽量少的运算单元。

(4) 延迟主导的设计方法

如果系统追求的是最低延迟,那么输入到输出的流水链条的最大长度是关键。此时往往全展开逻辑更有意义。对流水链条的优化可以根据DFG进行,在确定了主流水时延的基础上,优化数据通路和存储逻辑,从而构建出延迟敏感的系统。


总  结

本文从提升效率e的角度出发,阐述了如何采用时空二维平面评估效率,以及流水线结构下的效率评估方法。之后阐述了如何采用时序图法构建一个高e值的数据通路,并通过其进行量化早期评估。之后我们还阐述了系统设计和配平方法。最后,我们介绍了其他基于主导因素的设计。本文是对极限性能量化设计的主要部分,是“追求极限性能的芯片设计方法(一)”中的内容的具体阐述。系列文章(三)将对本文方法的具体实施例子阐述。另外,对于一个具体设计而言,不理想的因素还有很多,系列文章(四)将详细阐述各种引起性能下降的原因的排查与分析,敬请大家关注。


作者简介

吴臻志博士,清华大学类脑计算研究中心助理研究员。专长通信基带专用处理器和信道译码加速器设计,神经网络和神经形态芯片设计。邮件:wuzhenzhi@gmail.com

同行及朋友可加微信:zhenzhi-wu


题图来自网络,版权归原作者所有

推荐阅读  

AI芯片架构的争论真有意义吗?

专用处理器设计方法&工具

从Nvidia开源深度学习加速器说起

Nvidia Volta - 架构看点

AI会给芯片设计带来什么?

如何做神经网络处理器的需求分析?

深度神经网络的模型·硬件联合优化

脉动阵列 - 因Google TPU获得新生

长按二维码关注

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存